عندما تسبح في خلايا
جداول Microsoft Excel، يراودك ذلك الفضول العجيب وتتكاثر
الاسئلة -من خصالك كمبرمج- كيف تم تصميم هذا البرنامج؟؟ كيف يمكن
لهذا البرنامج ان يعرض لك آلاف الخلايا ويحفظها لك في ملفات دون
استهلاك هذه المساحة الكبيرة؟ وكيف يقوم برتيب المدخلات في خلايا
على شكل جداول؟ وكيف ... وكيف ... الخ من الاسئلة التي تثير
اهتمامات المبرمجين. في السطور التالية سنقوم بتصميم برنامج بسيط
لعرض الجداول الممتدة اسميته VB4ARAB Excel.
في
البداية عليك معرفة ان برنامج Microsoft Excel قام بتطويره اكثر
من 200 مبرمج محترف واستغرق شهور عدة لاتمامه، بالاضافة الى
الدعم المادي والمعنوي من قبل كبريات شركات تطوير البرامج
Microsoft. اما برنامجنا VB4ARAB فلم يصممه الا مبرمج واحد متوسط
الخبرة، واستغرق يومين، فارجو ان تقتنع فيه رغم البساطة التي قد
تجدها في البرنامج. مع ذلك، توجد ثلاثة مزايا في برنامج VB4ARAB
Excel ليست موجودة في Microsoft Excel وهي:
1) في
Microsoft Excel العدد الاقصى من الاعمدة هو 256 والعدد الاقصى
من السطور Rows هو 65536، بينما Vb4arab Excel فالعدد الاقصى
للاعمدة يتجاوز 2147483647 وهو نفس العدد الاقصى
للسطور!
2) ان مطوره عربي، ولست بكلمة عربي قاصدا احياء
القومية العربية، وانما اقاصد انني وضعت اللغة العربية في عين
الاعتبار اثناء تصميم البرنامج، فلن تحتاج الى خاصية RightToLeft
او تقنية المرءاة، فـ Vb4arab Excel موجه للمستخدم العربي كما
تلاحظ في الشكل التالي:

3) انه برنامج مجاني 100% بل ويمكنك الحصول على
شفرته المصدرية بالكامل مكتوبة بلغة VB6، ولم استخدم اجراء واحد
من اجراءات API!
الفوائد التي قد تجنيها من متابعة هذا
الموضوع ستكون جيدة جدا لك، حيث ستتعلم كيف تطور اداة تحكم
ActiveX Control لعرض الجداول اسمها Vb4arabGrid، وستتعلم
الطريقة الصحيحة لتقسيم البرنامج، وستتعلم اسلوب التنفيذ عند
الطلب On Demand Execution، و التصنيف الفرعي Subclassing
للفئات.
اقسام المشروع

قسمت برنامج Vb4arab Excel الى قسمين، القسم الاول
هو البرنامج الرئيسي Vb4arab Excel والقسم الثاني خاص لتصميم
اداة تحكم لعرض الجداول اسمها VB4arabGrid تحتوي على فئة Class
اضافية باسم CData حيث تمكن الجدول من عرض اكثر من صفحة Sheet
دون الحاجة الى انشاء نسخة جديدة من الاداة. فلو تلاحظ ان ورقة
العمل Workbook الموجودة في Microsoft Excel يمكنها ان تعرض لك
اكثر من صفحة Sheet، فلا تعتقد ان مطوروا Microsoft Excel بذلك
الحد من الغباء الذي يحدهم الى استخدام اكثر من اداة تحكم، وانما
يستخدمون اداة تحكم واحدة فقط لعرض بيانات الصفحات المختلفة كل
صفحة لها فئة مستقلة -قد تكون باسم CSheet- وهي نفس الفكرة التي
طبقناها في برنامجنا Vb4aab Excel ولكن اسم فئة بيانات الصفحة هو
CData. والان لنصمم البرنامج الرئيس، واداة التحكم حيث ستكون
البداية مع الفئة CData.
اولا: تصميم الفئة
CData
من الاساليب الاحترافية لتصميم البرامج هو فصل كود
مخزن البيانات عن كود عرض البيانات، وهذا الاسلوب قد تعلمت منذ
زمن طويل عندما كنت ابرمج بـ Visual C، حيث كانت توفر لي مكتبة
MFC فئتين الاولى لحفظ البيانات CDocument والاخرى لعرضها
CView.
الفئة CData تحتوي على جميع البيانات التي تتعلق
بالجدول الحالي، عرض الاعمد، ارتفاع السطور، محتويات الخلايا.
وهي مستقلة بحد ذاتها تتبع لاداة التحكم Vb4arabGrid فقط، فاداة
التحكم Vb4arab Grid تقوم بقراءة البيانات من هذه الفئة ومن ثم
رسمها على شكل جدول.
المشكلة التي ستصادفك هي ان عدد
الاعمدة والسطور كبير جدا جدا (يتجاوز 2147483647) وعدد الخلايا
اكبر (x2147483647 x 2147483647) فلو قمت بتجهيز مصفوفة لحفظ
جميع بيانات الخلايا وعرض الاعمدة واتفاع الخلايا، فقد تحتاج الى
20 خادم Server لحفظ بيانات جدولك. لذلك دعنا نحفظ القيم التي
قام المستخدم بتعديلها فقط، اما القية قستحتوي على قيم افتراضية
Default Valuse، وهذا الذي فعلته بالضبط في الفئة
CData:
code:
Public iColDefaultWidth As Integer ' العرض الافتراضي للعمود
Public iRowDefaultHeight As Integer ' الارتفاع الافتراضي للسطر
Private ColsProp() As ColPropUDT ' خصائص الاعمدة
Private RowsProp() As RowPropUDT ' خصائص السطور
Private CellsProp() As CellPropUDT ' خصائص الخلايا
| |
فعندما تقوم اداة التحكم
بالاستعلام عن ارتفاع السطر 2 مثلا، سنرى ما اذا كان السطر 2
موجود في المصفوفة ( )RowsProp لنعود بقيمة ارتفاع السطر، وان لم
يقم المستخدم بتعديل ارتفاع السطر، فسنعود بقيمة افتراضية يحملها
المتغير iRowDefaultHeight. وستجد هذا الكود في الخاصية
RowHeight: